#ifndef MICROSERVICE_H
#define MICROSERVICE_H

#include <zmq.hpp>
#include <string>
#include <functional>
#include <thread> // 用于多线程
#include <iostream>
class Microservice {
public:
    // 构造函数，初始化ZeroMQ上下文和套接字，设置服务端点
    Microservice(const std::string& endpoint) : context_(1), socket_(context_, ZMQ_REP), endpoint_(endpoint) {}

    // 析构函数，关闭套接字和上下文
    ~Microservice() {
        socket_.close();
        context_.close();
    }

    // 启动服务
    void start() {
        // 绑定到指定的端点
        socket_.bind(endpoint_);

        // 创建一个线程来处理消息
        std::thread t(&Microservice::handleMessages, this);
        t.detach(); 				// 分离线程，使得主线程可以继续执行
    }

    // 停止服务
    void stop() {
        // 关闭套接字
        socket_.close();
    }

    // 设置消息处理回调函数
    void setCallback(std::function<std::string(const std::string&)> callback) {
        callback_ = callback;
    }

private:
    zmq::context_t context_; 									// ZeroMQ 上下文
    zmq::socket_t socket_;   									// ZeroMQ 套接字
    std::string endpoint_;   									// 服务端点
    std::function<std::string(const std::string&)> callback_; 	// 消息处理回调函数

    // 处理接收到的消息
    void handleMessages() {
        while (true) {
            // 接收消息
            zmq::message_t request;
            // 接收消息，并检查返回值
            zmq::recv_result_t result = socket_.recv(request, zmq::recv_flags::none);
            if (result.has_value()) {
              //   std::cout << "Received message: " << std::string(static_cast<char*> (request.data()), request.size()) << std::endl;
            } else {
                std::cout << "Error receiving message: " << zmq_strerror(zmq_errno()) << std::endl;
            }

            // 转换消息为字符串
            std::string message = std::string(static_cast<char*>(request.data()), request.size());

            std::string response;

            // 调用回调函数处理消息
            if (callback_) {
               response = callback_(message);
            }
            else {
                response = "Error: No callback function set";
            }
            zmq::message_t reply(response.size());
            memcpy(reply.data(), response.data(), response.size());
            // 发送消息，并指定发送标志为默认值
            socket_.send(reply, zmq::send_flags::none);
        }
    }
};

#endif // MICROSERVICE_H